package cn.aiweiyi.qingjing.coupon.settlement.executor.impl;

import cn.aiweiyi.qingjing.coupon.comm.constant.CouponCategory;
import cn.aiweiyi.qingjing.coupon.comm.vo.CouponTemplateSDK;
import cn.aiweiyi.qingjing.coupon.comm.vo.SettlementInfo;

import cn.aiweiyi.qingjing.coupon.settlement.executor.AbstractExecutor;
import cn.aiweiyi.qingjing.coupon.settlement.executor.RuleExecutor;
import cn.aiweiyi.qingjing.coupon.settlement.util.BigDecimalUtils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Collections;

/**
 * 满减优惠券结算规则执行器
 */
@Slf4j
@Component
public class ManJianExecutor extends AbstractExecutor implements RuleExecutor {

    /**
     * 规则类型标记
     *
     * @return
     */
    @Override
    public CouponCategory ruleConfig() {
        return CouponCategory.MANJIAN;
    }

    /**
     * 优惠券规则的计算
     *
     * @param settlementInfo 包含了选择的优惠券
     * @return 修正过的结算信息
     */
    @Override
    public SettlementInfo computeRule(SettlementInfo settlementInfo) {
        // 总价，2位小数
        double goodsSum = retain2Decimals(goodsCostSum(settlementInfo.getGoodsInfos()));
        // 检验并处理商品信息和优惠券类型不匹配的情况
        SettlementInfo probability = processGoodsTypeNotSatisfy(settlementInfo, goodsSum);
        // 检验的结果是不匹配
        if (null != probability) {
            log.debug("满减优惠券模板与商品信息不匹配!");
            return probability;
        }
        // 判断满减是否符合折扣标准
        CouponTemplateSDK templateVO = settlementInfo.getCouponAndTemplateInfos().get(0).getTemplate();
        // 取出模板中的【门槛金额】
        double base = (double) templateVO.getRule().getDiscount().getBase();
        // 满减的金额
        double quota = (double) templateVO.getRule().getDiscount().getQuota();
        // 如果没达到【门槛金额】，则直接返回商品总价
        if (goodsSum < base) {
            log.debug("当前商品总价未达到满减门槛！");
            settlementInfo.setCost(goodsSum);// 原价
            settlementInfo.setCouponAndTemplateInfos(Collections.emptyList());// 清空优惠券信息
            return settlementInfo;
        }
        // 计算使用优惠券之后的价格 - 结算
        double costAfterDiscount = BigDecimalUtils.subtract(goodsSum, quota);
        settlementInfo.setCost(costAfterDiscount > minCost() ? costAfterDiscount : minCost());
        log.info("使用满减优惠券使得应付金额从{}减少到{}元。", goodsSum, settlementInfo.getCost());
        return settlementInfo;
    }
}
